//3-8译码器，功能与74138一致，74138有一个高电平使能信号，2个低电平使能信号g2a,g2b,只有当g1,g2a,g2b为100时，译码器才能使能；其输出低电平有效。
//制作者：FPGA研究者
//时间：2022年6月11日

module tt74138(a,y,g1,g2a,g2b);
  input [2:0] a; 
  input g1,g2a,g2b;
  output reg[7:0]  y;
  always@(*) begin
   if(g1&&(~g2a)&&(~g2b)) begin
	case(a)
	  3'b000:y=8'b1111_1110;
	  3'b001:y=8'b111_1101;
	  3'b010:y=8'b1111_1011;
	  3'b011:y=8'b1111_0111;
     3'b100:y=8'b1110_1111;
	  3'b101:y=8'b1101_1111;
	  3'b110:y=8'b1011_1111;
	  3'b111:y=8'b0111_1111;
	  default: y=8'hff;
	  
	 endcase
	 end
	else y=8'hff;
	end
endmodule
 


//扩展4-16译码器 不用case语句设计
module tt74138(clk,rst_n,ain,yout);
   input clk,rst_n;
	input [3:0]ain;
	output reg [15:0] yout;
	integer i;
always@(posedge clk) begin
   if(!rst_n) begin
	  yout<=16'hffff;//低电平有效
	  i=0;
	  end
	else if(ain<=4'b1111)begin
	// i=ain[3]*8+ain[2]*4+ain[1]*2+ain[0]*1;
	 yout <=16'hffff;
	 yout[ain]<=1'b0;
	 end
	else 
	 yout <=16'hffff;
	end
endmodule


//编码器16-4，不用case语句；低电平触发
module tt74138(clk,rst_n,ain,yout);
  input clk,rst_n;
  input [15:0]ain;
  output reg [3:0] yout;
  reg [3:0] i;
  
always@(posedge clk) begin
   if(!rst_n) begin
	  yout<=4'h0;
	  i=0;
	  end 
	  else if(ain!=16'hffff)//有bug，16位数据为不定态时，数据输出与前一个数据一致。
	begin
	for(i=0;i<4'hf;i=i+1) 
	begin
	 if(ain[i]==0)//低电平有效
	 yout<=i;//这里不能加else 
	 end
	end
	else 
	  yout<=4'hz;
end
endmodule
	 